package com.ecut.drug_bid.service;

import com.ecut.drug_bid.domain.Message;
import com.ecut.drug_bid.domain.Tender;
import com.ecut.drug_bid.dto.MessageCreateRequest;
import com.ecut.drug_bid.repository.MessageRepository;
import com.ecut.drug_bid.repository.TenderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class MessageService {

    private final MessageRepository messageRepository;
    private final TenderRepository tenderRepository;

    // 查询所有留言（已发布的）
    public List<Message> findAllPublished() {
        return messageRepository.findByStatusOrderByCreatedAtDesc("PUBLISHED");
    }

    // 根据招标项目编号查询留言
    public List<Message> findByTenderCode(String tenderCode) {
        return messageRepository.findByTargetTenderOrderByCreatedAtDesc(tenderCode);
    }

    // 根据作者ID查询
    public List<Message> findByAuthorId(Long authorId) {
        return messageRepository.findByAuthorIdOrderByCreatedAtDesc(authorId);
    }

    // 根据ID查询
    public Optional<Message> findById(Long id) {
        return messageRepository.findById(id);
    }

    // 管理员功能：获取所有留言（包括已隐藏的）
    public List<Message> findAll() {
        return messageRepository.findAllByOrderByCreatedAtDesc();
    }

    // 管理员功能：根据状态查询留言
    public List<Message> findByStatus(String status) {
        return messageRepository.findByStatusOrderByCreatedAtDesc(status);
    }

    // 管理员功能：显示留言
    @Transactional
    public void show(Long messageId) {
        Message message = messageRepository.findById(messageId)
            .orElseThrow(() -> new RuntimeException("留言不存在"));
        message.setStatus("PUBLISHED");
        messageRepository.save(message);
    }

    // 发布留言
    @Transactional
    public Message create(MessageCreateRequest request, Long authorId) {
        // 如果关联了招标项目，检查项目是否存在
        if (request.getTargetTender() != null && !request.getTargetTender().isEmpty()) {
            if (!tenderRepository.existsById(request.getTargetTender())) {
                throw new RuntimeException("关联的招标项目不存在");
            }
        }

        Message message = new Message();
        message.setAuthorId(authorId);
        message.setTargetTender(request.getTargetTender());
        message.setContent(request.getContent());
        message.setVisibleScope(request.getVisibleScope() != null ? request.getVisibleScope() : "ALL");
        message.setStatus("PUBLISHED");
        message.setCreatedAt(LocalDateTime.now());

        return messageRepository.save(message);
    }

    // 隐藏留言（管理员）
    @Transactional
    public void hide(Long messageId) {
        Message message = messageRepository.findById(messageId)
            .orElseThrow(() -> new RuntimeException("留言不存在"));
        message.setStatus("HIDDEN");
        messageRepository.save(message);
    }

    // 删除留言（管理员或作者本人）
    @Transactional
    public void delete(Long messageId) {
        if (!messageRepository.existsById(messageId)) {
            throw new RuntimeException("留言不存在");
        }
        messageRepository.deleteById(messageId);
    }
}